package com.starlinkdt.common.utils;

public class DataCheckUtils {

    /**
     * 校验统一社会信用代码是否合法（18位，符合GB 32100-2015）
     *
     * @param creditCode 待校验的统一社会信用代码
     * @return boolean 是否合法
     */
    public static boolean isValidUnifiedSocialCreditCode(String creditCode) {
        if (creditCode == null || creditCode.length() != 18) {
            return false;
        }

        // 合法字符集合：数字、大写字母（不含 I、O、Z、S、V）
        String regx = "^[1-9A-HJ-NPQRTUWXY][0-9A-HJ-NPQRTUWXY]{16}[0-9A-DJ-NP-TV-X]$";
        return creditCode.matches(regx);
    }

    /**
     * 校验手机号是否合法
     *
     * @param phoneNumber 待校验的手机号
     * @return boolean 是否合法
     */
    public static boolean isValidChinesePhoneNumber(String phoneNumber) {
        if (phoneNumber == null || phoneNumber.length() != 11) {
            return false;
        }
        String regex = "^1[3-9]\\d{9}$";
        return phoneNumber.matches(regex);
    }


    /**
     * 校验身份证号码是否合法（支持15位和18位）
     *
     * @param idNumber 待校验的身份证号码
     * @return boolean 是否合法
     */
    public static boolean isValidIdNumber(String idNumber) {
        if (idNumber == null) {
            return false;
        }

        // 15位身份证：数字15位，前6位地区码，中间6位年月日（YYMMDD），后3位顺序码
        String fifteeRegex = "^\\d{15}$";
        if (idNumber.matches(fifteeRegex)) {
            return true;
        }

        // 18位身份证：前17位数字，最后一位为数字或X/x
        String eightteenRegex = "^\\d{17}[\\dXx]$";
        if (!idNumber.matches(eightteenRegex)) {
            return false;
        }

        // 校验出生日期部分是否合法（YYYYMMDD）
        String birthdayPart = idNumber.substring(6, 14);
        try {
            int year = Integer.parseInt(birthdayPart.substring(0, 4));
            int month = Integer.parseInt(birthdayPart.substring(4, 6));
            int day = Integer.parseInt(birthdayPart.substring(6, 8));

            if (year < 1900 || year > 2100) return false;
            if (month < 1 || month > 12) return false;
            if (day < 1 || day > 31) return false;

            // 简单校验月份天数（不严格到闰年）
            if (isInvalidDay(year, month, day)) {
                return false;
            }

        } catch (Exception e) {
            return false;
        }

        return true;
    }

    /**
     * 判断给定的年月日是否是无效日期
     *
     * @param year  年份
     * @param month 月份
     * @param day   日期
     * @return 是否无效
     */
    private static boolean isInvalidDay(int year, int month, int day) {
        switch (month) {
            case 2:
                if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
                    return day > 29; // 闰年2月
                } else {
                    return day > 28; // 平年2月
                }
            case 4:
            case 6:
            case 9:
            case 11:
                return day > 30;
            default:
                return day > 31;
        }
    }

    /**
     * 校验车牌号码是否合法（支持普通车、新能源车）
     *
     * @param licensePlate 待校验的车牌号码
     * @return boolean 是否合法
     */
    /**
     * 校验车牌号码是否合法（支持普通车、新能源车、武警、港澳、挂车、警车等复杂格式）
     *
     * @param licensePlate 待校验的车牌号码
     * @return boolean 是否合法
     */
    public static boolean isValidLicensePlateNumber(String licensePlate) {
        if (licensePlate == null || licensePlate.isEmpty()) {
            return false;
        }

        // 综合正则表达式，匹配所有合法车牌格式
        String regex = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵青藏川宁琼港澳]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4,5}$"
                + "|^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵青藏川宁琼]{1}[D|F]{1}[A-HJ-NP-Z0-9]{5}$"
                + "|^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵青藏川宁琼]{1}[A-Z]{1}[0-9]{6}$"
                + "|^WJ[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵青藏川宁琼]{1}[0-9]{5}$"
                + "|^使[0-9]{3}[A-Z]{1}$"
                + "|^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵青藏川宁琼]{1}[A-Z]{1}挂[0-9]{4}$"
                + "|^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵青藏川宁琼]{1}[A-Z]{1}警[0-9]{4}$"
                + "|^粤Z[A-HJ-NP-Z0-9]{4,5}(港|澳)?$";

        return licensePlate.matches(regex);
    }

    /**
     * 校验车辆识别码 VIN 是否合法（17位，不含 I、O、Q）
     *
     * @param vin 待校验的 VIN 码
     * @return boolean 是否合法
     */
    public static boolean isValidVinNumber(String vin) {
        if (vin == null || vin.length() != 17) {
            return false;
        }

        // 正则表达式：匹配除 I、O、Q 外的 A-Z（不区分大小写）和数字
        String regex = "^[A-HJ-NPR-Z\\d]{17}$";

        return vin.toUpperCase().matches(regex);
    }



}
